#ifndef SIGNAL_COLLECT_H
#define SIGNAL_COLLECT_H

#include "data_structure.h"
#include "eventcommand.h"
#include "parse_proto.h"

typedef struct SigCollectCatch
{
    // topic
    std::shared_ptr<std::string> topic;
    //数据
    std::shared_ptr<std::string> data;
    //数据长度
    uint32_t _length;
} SigCollectCatch;


namespace DcAdr
{
    class SignalCollect : public EventCommand
    {
    private:
        /* data */
    public:
        static SignalCollect &getInstance();

        bool protoRuleContainTopic(const std::string &topic);

        void push2SigMap(const ProtoData &data);
        void collectSignal();
        void collectSignalOneThread_1(const SigCollectCatch &data);
        void collectSignalOneThread(const SigCollectCatch &data, ThreadType type);
        void swapSignaledMap();
        void clearSignaledMap();

        void sendSignalShot();
        void sendSignalToMqtt();

    private:
        SignalCollect(/* args */);
        ~SignalCollect();

        void test(Json::Value &root);

        ParseProto m_protoParser;
        ParseProto m_protoParser2; //另一个线程用这个解析器

        int m_TimerCount = 0;

    public:
        map<string, SigCollectCatch> m_signalCache;     //缓存200ms内的数据  用于自驾信号采集 数据 <topic,（topic，数据）>

        std::map<std::string, Json::Value>
            m_changeSignalData; //变化发送队列，每200MS发送一次 //专门给发送线程用

        std::map<std::string, Json::Value>
            m_cycSignalData; //周期发送队列，每3S发送一次 （全的曾经收到的信号都在这） //专门给发送线程用

        std::mutex m_dataLock;

        std::map<std::string, Json::Value> m_signalMapValue_1;//线程1缓存的解析到的信号
        std::map<std::string, Json::Value> m_signalMapValue_2;//线程2缓存的解析到的信号 
        std::map<std::string,std::vector<std::string>> g_mqtt_seleced_signal;//判断是不是需要通过mqtt上报的信号
        std::map<std::string,std::vector<Json::Value>> g_mqtt_seleced_signal_value;//需要上报的mqtt信号

    };
}
#endif // SIGNAL_COLLECT_H